import React from 'react';
import { useTooltipLifecycle } from '../core/useTooltipLifecycle';

/**
 * 复制按钮 Tooltip 状态管理 Hook
 * 
 * 功能：
 * 1. 管理复制按钮的 Tooltip 显示状态和文案
 * 2. 处理复制成功后的状态切换和自动恢复
 * 3. 防止点击后立即关闭的误触问题
 * 4. 集成生命周期管理，在窗口切换等场景下自动重置
 * 
 * @returns 复制 Tooltip 相关的状态和处理函数
 * 
 * @example
 * ```tsx
 * const {
 *   tooltipContent,
 *   isTooltipOpen,
 *   handleCopySuccess,
 *   handleMouseLeave,
 *   handleBlur,
 *   tooltipOpenChange
 * } = useCopyTooltip();
 * 
 * // 在复制成功后调用
 * await copyToClipboard(url);
 * handleCopySuccess();
 * ```
 */
export const useCopyTooltip = () => {
    // Tooltip 状态管理
    const [tooltipContent, setTooltipContent] = React.useState('复制');
    const [isTooltipOpen, setIsTooltipOpen] = React.useState(false);
    const timeoutRef = React.useRef<NodeJS.Timeout | null>(null);
    
    // 防误关闭：点击后短时间内忽略关闭请求
    const suppressCloseUntilRef = React.useRef<number>(0);

    // 统一重置函数
    const resetTooltip = React.useCallback(() => {
        // 清理定时器
        if (timeoutRef.current) {
            clearTimeout(timeoutRef.current);
            timeoutRef.current = null;
        }
        // 重置所有状态
        setIsTooltipOpen(false);
        setTooltipContent('复制');
    }, []);

    // 集成生命周期管理：窗口切换等场景自动重置
    useTooltipLifecycle(resetTooltip);

    // 组件卸载时清理定时器
    React.useEffect(() => {
        return () => {
            if (timeoutRef.current) {
                clearTimeout(timeoutRef.current);
            }
        };
    }, []);

    // 处理复制成功后的状态切换
    const handleCopySuccess = React.useCallback(() => {
        // 设置防误关闭时间窗口（120ms内忽略关闭请求）
        suppressCloseUntilRef.current = performance.now() + 120;

        // 清理之前的定时器
        if (timeoutRef.current) clearTimeout(timeoutRef.current);
        
        // 切换到"已复制"状态
        setTooltipContent('已复制');
        setIsTooltipOpen(true);

        // 3秒后恢复到初始状态
        timeoutRef.current = setTimeout(() => {
            setTooltipContent('复制');
            timeoutRef.current = null;
        }, 3000);
    }, []);

    // 处理 Tooltip 开关状态变化
    const handleTooltipOpenChange = React.useCallback((next: boolean) => {
        // 如果在防误关闭时间窗口内，忽略关闭请求
        if (!next && performance.now() < suppressCloseUntilRef.current) {
            return;
        }
        
        setIsTooltipOpen(next);
    }, []);

    // 鼠标离开按钮时重置（用于 onMouseLeave）
    const handleMouseLeave = React.useCallback(() => {
        resetTooltip();
    }, [resetTooltip]);

    // 失焦时重置（用于 onBlur）
    const handleBlur = React.useCallback(() => {
        resetTooltip();
    }, [resetTooltip]);

    return {
        // 状态
        tooltipContent,
        isTooltipOpen,
        
        // 事件处理函数
        handleCopySuccess,
        handleMouseLeave,
        handleBlur,
        handleTooltipOpenChange,
        
        // 手动重置函数
        resetTooltip
    };
};